一般连表程序在c语言中要用link list来实现,我贴一个我写的程序在这里,可以运行,这个程序里包含一个structer纪录学生信息,学生号码已极学生姓名,纪录通过insert_node添加,通过delete_node删除,并在最开始的时候通过create list function来创建最原始的数据,不用理会里面的reverse function。
#include <stdio.h>
#include <stdlib.h>
struct list
{
int num;
char name[10];
struct list *next;
};
typedef struct list node;
typedef node *link;
link find_node_loc(link ptr, link ptr1, int reversed)
{
link ptr0=ptr;
link ptr2=NULL;
if(reversed)
{
while(ptr0!=NULL && (ptr0->num > ptr1->num))
{
ptr2=ptr0;
ptr0=ptr0->next;
}
}
else
{
while(ptr0!=NULL && (ptr0->num < ptr1->num))
{
ptr2=ptr0;
ptr0=ptr0->next;
}
}
return ptr2;
}
link find_node(link head,int IDnum)
{
link ptr;
ptr=head;
while (ptr!=NULL)
{
if(ptr->num==IDnum)
return ptr;
ptr=ptr->next;
}
return ptr;
}
void free_list(link head)
{
link ptr;
while(head!=NULL)
{
ptr=head;
head=head->next;
free(ptr);
}
}
link create_list()
{
link insert_node( link head, link ptr, link newnode);
link p1,p2;
link head;
link ptrf;
int panduan=1;
int number=1;
int reversed=0;
head=(link)malloc(sizeof(node));
if(!head){
printf("Memory Allocation Fail! n");
exit(1);
}
else{
head->num=NULL;
printf("Please enter the %d student ID==> ",number);
scanf("%d",&panduan);
while(panduan!=0){
if (number==1){
head->num=panduan;
printf("Please enter the new student name==> ");
scanf("%s",&head->name);
head->next=NULL;
number++;
}
else{
printf("Please enter the %d student ID==> ",number);
scanf("%d",&panduan);
if(panduan!=0){
p1=(link)malloc(sizeof(node));
p1->num=panduan;
printf("Please enter the new student name==> ");
scanf("%s",&p1->name);
p1->next=NULL;
number++;
p2=p1;
ptrf = find_node_loc(head, p2, 0);
head=insert_node(head,ptrf,p2);
}
}
}
return head;
}
}
void print_list(link ptr)
{
int i=1;
while(ptr!=NULL){
printf("Student %dn",i++);
printf("ID number:%dn",ptr->num);
printf("Student name:%sn",ptr->name);
printf("n");
ptr=ptr->next;
}
}
link insert_node(link head,link ptr, link newnode)
{
link pt1;
if (ptr!=NULL){
if(ptr->next!=NULL){
pt1=ptr->next;
ptr->next=newnode;
newnode->next=pt1;}
else{
ptr->next=newnode;
newnode->next=NULL;
}
}
else{
pt1=head;
head=newnode;
head->next=pt1;
}
return head;
}
link reverse(link newhead,int reversed){
link ptr1,ptr2,newhead1;
newhead1=newhead;
do{
newhead=newhead->next;
}while(newhead->next!=NULL);
do{
ptr1=newhead1;
newhead1=newhead1->next;
ptr2=find_node_loc(newhead,ptr1,reversed%2);
newhead=insert_node(newhead,ptr2,ptr1);
}while(newhead1!=newhead);
return newhead;
}
link delete_node(link head, link ptr,link ptr1)
{
link ptr2;
if(ptr!=head){
if(ptr->next==NULL){
ptr1->next=NULL;
free(ptr);
}
else{
ptr2=ptr->next;
free(ptr);
ptr1->next=ptr2;
}
}
else{
head=ptr->next;
free(ptr);
}
return head;
}
int main()
{
link head,ptr,newnode,ptr1;
int flag=1,reversed=0;
int IDnum,i;
head=create_list();
if(head->num==NULL){
printf("You didnt create a list,try againn");
getchar();
getchar();
}
else{
ptr=head;
printf("nnStudent Records Created!nn");
flag=1;
while(flag)
{
printf("n******************************************n");
printf("1: Insert new student recordn");
printf("2: Delete student recordn");
printf("3: Display students recordn");
printf("4: Reverse student recordn");
printf("0: Quitn");
printf("nPlease select a option to maintain the student record:n");
scanf("%d",&i);
switch(i)
{
case 0:
{
flag=0;
break;
}
case 1:
{
newnode=(link)malloc(sizeof(node));
if(!newnode)
{
printf("Memory Allocation Fail! n");
exit(1);
}
else
newnode->next=NULL;
printf("Please enter the new student ID==> ");
scanf("%d",&newnode->num);
printf("Please enter the new student name==> ");
scanf("%s",&newnode->name);
ptr = find_node_loc(head, newnode, reversed%2);
head = insert_node(head, ptr, newnode);
if (!head)
{
printf("Memory Allocation Fail! n");
exit(1);
}
printf("n**********************************************");
printf("nStudent record after insertion:nn");
print_list(head);
printf("**********************************************");
break;
}
case 2:
{
printf("reversed:%d",reversed);
printf("Which student you want to delete? (ID)==>");
scanf("%d",&IDnum);
if(IDnum)
{
ptr=find_node(head,IDnum);
ptr1=find_node_loc(head,ptr,reversed%2);
if(!ptr)
printf("no recordn");
else
{
head=delete_node(head,ptr,ptr1);
printf("n**********************************************");
printf("nStudent record after deleted node:n");
print_list(head);
printf("**********************************************");
}
break;
}
else
exit(1);
}
case 3:
{
print_list(head);
break;
}
case 4:
reversed++;
head=reverse(head,reversed);
print_list(head);
break;
default:
printf("Wrong input! Please input a number in (0-3)");
}
}
}
return 0;
}