动态链表的基本操作
该程序实现以下功能:
1. initlist_l(lnode&L); //建立一个带头结点的空链表
2. locationelem(linklist L, int i, elemtype &e); //在带头结点的单链表中查找第i个节点,若存在,则返回第i个元素的
值;否则返回error
3. listinsert_l(linklist &L, ini i, elemtype e); //在带头结点的单链表中第i个结点之前插入元素e
4. listdelete_l(linklist &L, int i, elemtype &e); //删除带头结点的单链表L上的第i个数据结点并用e返回其值
5. createlist_l(linklist &L, int n); //通过头插法建立一个含n个结点的单链表
6. createlist_lt(linklist &L, int n); //通过尾插法建立一个含n个结点的单链表7. display_l(linklist L); //打印链表
程序如下:
#include <stdio.h> #include <malloc.h> #include <stdlib.h> typedef int elemtype; //用户自定义数据类型 typedef struct lnode { elemtype data; struct lnode *next; }lnode, *linklist; //结点类型 void initlist_l(linklist &L); void createlist_l(linklist &L, int n); void display_l(linklist L); //打印链表 void locationelem(linklist L, int i, elemtype &e); void listinsert_l(linklist &L, int i, elemtype e); void listdelete_l(linklist &L, int i, elemtype &e); void destroy_l(linklist &L); //销毁链表 int main(void) { elemtype e = 3, x, insertdata; int num, insertnum, deletenum, len; linklist L; initlist_l(L); //通过函数分配内存空间 printf("输入链表的长度:"); scanf("%d", &len); createlist_l(L, len); //建立含len个结点的链表 display_l(L); printf("输入要显示的结点序号:"); scanf("%d", &num); locationelem(L, num, e); printf("%d\n", e); printf("输入插入的位置:"); scanf("%d", &insertnum); printf("插入的数字:"); scanf("%d", &insertdata); listinsert_l(L, insertnum, insertdata); //将insertdata插入链表的第insertnum结点之前 display_l(L); printf("输入删除的结点序号:"); scanf("%d", &deletenum); listdelete_l(L, deletenum, e); printf("删除结点的数据域是:%d\n", e); display_l(L); destroy_l(L); return 0; } void initlist_l(linklist &L) { L = (linklist)malloc(sizeof(lnode)); if (L == NULL) exit(1); L->next = NULL; } void locationelem(linklist L, int i, elemtype &e) { linklist p = L; //p指向表头 int j = 0; //j的初值为0, 即为头结点的序号 while (j<i && p!=NULL) { p = p->next; j++; //后移指针并计数 } if (p == NULL || j > i) { printf("该结点不存在\n"); return ; } e = p->data; } void createlist_l(linklist &L, int n) {//头插法 int i; linklist s; //这里相当于 lnode *s; if (L == NULL) exit(3); printf("输入%d个整数:\n", n); for (i=0; i<n; i++) { s = (linklist)malloc(sizeof(lnode)); if (s == NULL) //判断s分配空间是否成功 exit(4); scanf("%d", &s->data); s->next = L->next; L->next = s; } } void listdelete_l(linklist &L, int i, elemtype &e) { int j = 0; linklist p, r = L; while (r->next && j<i-1) {//查找第i-1个节点 r = r->next; j++; } if (r->next == NULL || j>i-1) { printf("链表中没有结点i\n"); return ; } p = r->next; r->next = p->next; free(p); } void listinsert_l(linklist &L, int i, elemtype e) { linklist s, r = L; int j = 0; while (r->next && j<i-1) {//找到第i-1个结点 r = r->next; j++; } if (r == NULL || j>i-1) //老老实实第写r == NULL, 不要刷帅写!r(很容易出错) { printf("链表的结点数小于i-1,或i<1\n"); return ; } s = (linklist)malloc(sizeof(lnode)); if (s == NULL) exit(4); s->data = e; s->next = r->next; r->next = s; } void display_l(linklist L) { printf("当前链表值为:\n"); linklist p = L->next; while (p) { printf("%d ", p->data); p = p->next; } printf("\n"); } void destroy_l(linklist &L) {//一个一个地删除结点 linklist p = L->next; while (p) { L->next = p->next; free(p); p = L->next; } free(L); printf("链表已销毁\n"); }
尾插法:void create_lt(linklist &L, int n) { linklist r = L, s; int i; while (r->next) r = r->next; for (i=0; i<n; i++) { s = (linklist)malloc(sizeof(lnode)); if (s == NULL) exit(5); scanf("%d", &s->data); s->next = r->next; r->next = s; r = s; } }