标签:
首先声明一个结构体类型,包含数据域和指针域。
typedef struct student { int num; char name[20]; struct student *next; }Student;
第二步是创建一个不含头结点的链表
Student *Create_stu(int n) //n为创建链表的元素个数 { Student *head,*tail,*p; //head为首节点,tail为尾节点 int num,i; char name[20]; head=tail=NULL; for(i=0;i<n;i++) { p=(Student *)malloc(sizeof(Student)); scanf("%d",&num); scanf("%s",name); strcpy(p->name,name); p->num=num; p->next=NULL; if(head==NULL) head=p; else tail->next=p; tail=p; } return head; }
第三步我们遍历刚刚创建的单链表
void Trave_stu(Student *head) { Student *p; p=head; while(p) { printf("%d and %s",p->num,p->name); p=p->next; } }
第四步我们进行插入操作,向该函数传递三个参数。因为链表无头结点,所以要考虑插入位置是否为第一个。
Student *Insert_stu(Student *head,Student *stu,int n) //head为头指针,stu为待插入的节点指针,n为插入的位置 { int i=1; Student *ptr,*ptr2,*ptr1; ptr=stu; if(n==1) //插入位置为第一个; { ptr->next=head; head=ptr; } else //插入位置不位第一个 { ptr2=head; while(ptr2&&i<n) { ptr1=ptr2; i++; ptr2=ptr2->next; } ptr->next=ptr2; ptr1->next=ptr; } return head; }
第五步是删除操作,其实和插入操作差不多,也要考虑删除元素是否为第一位。
Student *Delete_stu(Student *head,int n) { Student *p,*ptr1; int i=1; if(n==1) //删除元素位于第一个节点 { head=head->next; } else //删除元素不位于第一个节点 { p=head; while(p&&i<n) { ptr1=p; i++; p=p->next; } ptr1->next=p->next; } return head; }
最后非常简单,求链表的长度,设置一个计数器count,遍历链表至末尾,得到链表长度。
int Length_stu(Student *head) { int count=0; Student *p; p=head; while(p) { count++; p=p->next; } return count; }
标签:
原文地址:http://www.cnblogs.com/tanxing/p/4596589.html