|
- #include<stdio.h>
- #include<stdlib.h>
- typedef int Elemtype;
- typedef struct LNode //定义一个结构体
- {
- Elemtype data; //结点的数据域
- struct LNode *next; //节点的指针域
- }LNode , *LinkList; //指针类型
-
- int InitList(LinkList L) //带有头节点的单链表的初始化
- {
- L= (LinkList)malloc(sizeof(LNode));
- if (!L) //储存分配失败退出
- {
- printf("分配内存失败!\n");
- exit(0);
- }
- L->next = NULL; //空表长度为null
- return 0;
- }
-
- int LengthList(LinkList L) //计算链表长度
- {
- int length = 0;
- LinkList p;
- p = L->next;
- while (p)
- {
- length++;
- p = p->next;
- }
- return length;
- }
-
- int GetElem(LinkList L, int i, Elemtype e) //用e返回L中第i个元素值
- {
- LinkList p; //初始化,p指向首元结点,计数器j=1
- int j = 1;
- p = L->next; //顺序链表向后扫描,直到p为空或者p指向第i个元素
- while (p && j < i)
- {
- p = p->next; //p指向下一个元素
- ++j;
- }
- if (!p || j > i) //i不合法
- {
- printf("查询不到该元素!\n");
- return 0;
- }
- e = p->data;
- return 0;
- }
-
-
- void CreateList_F(LinkList L,int n) //头插法创建一个单链表,n为要插入的元素个数
- {
- int i;
- LinkList p;
- L = (LinkList)malloc(sizeof(LNode));
- L->next = NULL;
- printf("请输入您要插入元素的个数:");
- scanf("%d", &n);
- printf("请输入你要插入的元素值(用空格隔开):");
- for (i = n; i >0;--i)
- {
- p = (LNode*)malloc(sizeof(LNode));
- scanf_s("%d", &p->data);
- p->next = L->next;
- L->next = p;
- }
-
- }
-
- int InsertList_L(LinkList L, int i, Elemtype e) //在L中第i个位置插入元素e
- {
- LinkList p, s;
- int j = 0;
- p = L;
- while (p && j < i) //寻找第i-1结点
- {
- p = p->next;
- ++j;
- }
- if (!p || j > i) exit(1); //i大于表长+1或者小于1
- s = (LinkList)malloc(sizeof(LNode)); //生成新结点s
- s->data = e; //将结点的数据域置为e
- s->next = p->next; //将结点s插入L中
- p->next = s;
- return 0;
- }
-
- int DeleteList_L(LinkList L, int i) //删除L中第i个元素,并用e返回其值
- {
- LinkList p, q;
- int j = 0;
- p = L;
- printf("请输入要删除的结点位置:");
-
- while (p->next && j < i-1) //寻找第i个结点,并令p指向其前驱
- {
- p = p->next;
- ++j;
- }
- if (!(p->next) || j > i) exit(1); //删除位置不合理
- q = p->next; //临时保存被删除结点的地址以备释放
- p->next = q->next; //改变删除结点的前驱结点指针域
- free(q); //释放
- return 0;
- }
-
- void ShowList(LinkList L) //打印整个链表
- {
- LinkList p;
- p = L->next;
- if (p == NULL)
- {
- printf("这是一个空链表!\n");
- }
- printf("单链表");
- while (p)
- {
- printf(" -> %d", p->data);
- p = p->next;
- }
- printf("\n");
- }
-
- main()
- {
- LinkList L;
- int n;
- int i,k;
- printf("单链表的操作:\n");
- printf("\t1.头插法建立单链表\n");
- printf("\t2.输出单链表\n");
- printf("\t3.删除结点\n");
- printf("\t4.退出\n");
- do
- {
-
- printf("选择所需功能: ");
- scanf("%d",&k);
- switch(k)
- {
- case 1:CreateList_F( L, n);
- break;
- case 2:printf("单链表为:\n");
- ShowList(L);
- break;
-
- case 3:
- DeleteList_L( L, i);
- break;
-
- case 4:printf("退出");
- exit(0);
- default:printf("输入错误\n");
- exit(0);
- }
- }while(1);
- }
复制代码
删除和显示输出链表函数,增加对空链表的判断及反馈,供参考:
- int DeleteList_L(LinkList L, int i) //删除L中第i个元素,并用e返回其值
- {
- LinkList p, q;
- int j = 0;
- p = L;
- if(L == NULL){
- printf("这是一个空链表!\n");
- return -1;
- }
- //printf("请输入要删除的结点位置:");
-
- while (p->next && j < i-1) //寻找第i个结点,并令p指向其前驱
- {
- p = p->next;
- ++j;
- }
- if (!(p->next) || j > i) exit(1); //删除位置不合理
- q = p->next; //临时保存被删除结点的地址以备释放
- p->next = q->next; //改变删除结点的前驱结点指针域
- free(q); //释放
- return 0;
- }
-
- void ShowList(LinkList L) //打印整个链表
- {
- LinkList p;
- if (L == NULL)
- {
- printf("这是一个空链表!\n");
- return;
- }
- printf("单链表");
- p = L->next;
- while (p)
- {
- printf(" -> %d", p->data);
- p = p->next;
- }
- printf("\n");
- }
复制代码
|
|