链表这个数据结构的作用举足轻重,本文主要实现的是单向链表的一些基本的操作。 具体的实现如下所示,有错误的话,可以大胆地指出 ^_^ #include <stdio.h> #include <stdlib.h> typedef struct student { int data; struct student *next; }node; node* singlelist_create(); node* singlelist_reverse(node* head); void singlelist_print(node *head); void singlelist_delnode(node *head, int i , int &num); void singlelist_insert(node *head, int i,int num); int singlelist_length(node* head); int main(int argc, char *argv[]) { node *testhead; testhead = singlelist_create(); singlelist_print(testhead); int a,i; printf("Input your insert position :"); scanf("%d",&i); printf("Input your insert digital :"); scanf("%d",&a); singlelist_insert(testhead,i,a); singlelist_print(testhead); printf("Input your delete position :"); scanf("%d",&i); singlelist_delnode(testhead,i,a); //输出删除的元素 printf("The delete data is %d !/n",a); singlelist_print(testhead); printf("reverse the singlelist"); singlelist_reverse(testhead); singlelist_print(testhead); return 0; } node* singlelist_create() { int x; node *head,*p,*s; head = (node*)malloc(sizeof(node)); head->next = NULL; p = head; printf("Please input your numbers: /n"); scanf("%d",&x); while(x != 0) { s = (node*)malloc(sizeof(node)); s->data = x; s->next = NULL; p->next = s; p = s; printf("Please input your numbers: /n"); scanf("%d",&x); } return head; } /*打印单向链表中的各个元素*/ void singlelist_print(node* head) { node *p; int n =singlelist_length(head); if(n == 0) printf("/n The singlelist's length is 0 !/n"); else printf("/nNow,these %d records are : /n",n); if(head != NULL) { p = head->next; while(p != NULL) { printf("%d ",p->data); p = p->next; } } printf("/n"); } //删除链表中位置为i的元素,并将其节点的值返回 void singlelist_delnode(node *head, int i , int &num) { node * p = head; int j = 0; while(p && j < i - 1) { p = p ->next; j++; } if(!p || j > i - 1) { printf("delete error!"); return; } node *q = p ->next; p ->next = q ->next; num = q ->data; free(q); } /*逆置单向链表*/ node* singlelist_reverse(node* head) { if(head ->next == NULL) { printf("The singlelist is null!"); } else { node *p1,*p2,*p3; p1 = head ->next; p2 = p1 ->next; while(p2!= NULL) { p3 = p2 -> next; p2 ->next = p1; p1 = p2; p2 = p3; } //将原序列中第一个元素的next设置为NULL head ->next ->next = NULL; //将原序列中的最后一个元素列为第一个元素 head ->next = p1; } return head; } //在第i个位置插入数据块的值为num的元素 void singlelist_insert(node *head, int i,int num) { node *p = head; int j = 0; while(p && j < i-1) { p = p->next; j++; } if(!p || j > i-1) { printf("insert error!"); return; } //在位置i插入元素 node *e = (node*)malloc(sizeof(node)); e->data = num; e->next = p->next; p->next = e; } /*计算单向链表数据元素的长度*/ int singlelist_length(node* head) { int n = 0; node *p; p = head->next; while(p != NULL) { p = p->next; ++n; } return n; }