关于C语言链表的操作实例
有这样一个结构体char team//队伍名
int jifen//积分
int win//胜利场数
int lost//失利场数
现在有N个队伍,想把一个队伍信息存入一个链表结点,可增加删除队伍,修改队伍信息,用链表具体怎么实现。本人一直对链表不太清楚,想通过此例理解链表,谢谢各位高手赐教,最好注释详细,谢谢!
最佳答案
一般连表程序在c语言中要用link list来实现,我贴一个我写的程序在这里,可以运行,这个程序里包含一个structer纪录学生信息,学生号码已极学生姓名,纪录通过insert_node 添加,通过delete_node删除,并在最开始的时候通过create list function来创建最原始的数据,不用理会里面的reverse function。
#include
#include
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 %d\n",i++);
printf("ID number:%d\n",ptr->num);
printf("Student name:%s\n",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 again\n"); getchar();
getchar();
}
else{
printf("\n\nStudent Records Created!\n\n");
flag=1;
while(flag)
{
printf("\n******************************************\n");
printf("1: Insert new student record\n");
printf("2: Delete student record\n");
printf("3: Display students record\n");
printf("4: Reverse student record\n");
printf("0: Quit\n");
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);
{
printf("Memory Allocation Fail! \n");
exit(1);
}
printf("\n**********************************************"); printf("\nStudent record after insertion:\n\n");
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 record\n");
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;
}