每天一个小程序(2)——带头结点的链表的创建以及插入和删除

来源:互联网 发布:怎样学好js 编辑:程序博客网 时间:2024/05/16 05:10

#include<stdio.h>#include<stdlib.h>typedef int datatype;typedef struct lnode{datatype data;struct lnode *next;}LNode,*LinkList;int flag = -1;LinkList Create_Head(){LinkList head;head = (LinkList)malloc(sizeof(LNode));head->next = NULL;return head;}LinkList Create_LinkList1()//带头结点 头插法{LinkList s,L;int x;L = Create_Head();scanf("%d",&x);while(x != flag){s = (LinkList)malloc(sizeof(LNode));s->data = x;s->next = L->next;L->next = s;scanf("%d",&x);}return L;}LinkList Create_LinkList2()//带头结点 尾插法{LinkList s,L,r;int x;L = Create_Head();r = L;scanf("%d",&x);while(x != flag){s = (LinkList)malloc(sizeof(LNode));s->data = x;s->next = NULL;r->next = s;r = s;scanf("%d",&x);}return L;}LNode * Get_LinkList(LinkList L,int i){LNode * p = L->next;int j = 0;while(p->next != NULL && j < i){p = p->next;j++;}if(j == i)return p;elsereturn NULL;}int Insert_LinkList(LinkList L,int i,datatype x){LNode *p,*s;p = Get_LinkList(L,i-1);if(p == NULL){printf("参数i错误");return 0;}else{s = (LNode*)malloc(sizeof(LNode));s->data = x;s->next = p->next;p->next = s;return 1;}}int Length_LinkList2(LinkList L)//不带头结点求表长{LNode *p = L->next;int j = 0;while(p){j++;p = p->next;}return j;}void print(LinkList L){LinkList p = L->next;while(p){printf("%d ",p->data);p = p->next;}int len = Length_LinkList2(L);printf("\nLength = %d\n",len); }int Del_LinkList(LinkList L,int i){LinkList p,s;p = Get_LinkList(L,i-1);if(p == NULL){printf("第%d个节点不存在",i-1);return -1;}else if(p->next == NULL){printf("第%d个节点不存在",i);return 0;}else{s = p->next;p->next = s->next;free(s);return 1;}}void main(){LinkList L = Create_LinkList2();print(L);int iPos,iValue;printf("请输入要插入的位置:\n");scanf("%d",&iPos);printf("请输入要插入的值:\n");scanf("%d",&iValue);if(0 == Insert_LinkList(L,iPos,iValue)){return;}print(L);printf("请输入要删除的位置:\n");scanf("%d",&iPos);int a = Del_LinkList(L,iPos);if(0 == a && -1 == a ){return;}print(L);}


单链表小结

1. 通过保存直接后继元素的存储位置来表示数据元素之间的逻辑关系;
2. 插入、删除操作通过修改结点的指针实现;不需要做大量元素的移动。
3. 不能随机存取元素;


0 0