数据结构线性表链序存储,线性存储c语言实现代码
typedf用法:https://blog.csdn.net/qq_29350001/article/details/53883571
#include<stdio.h> #include<stdlib.h> typedef int ElementType; typedef struct LNode * PtrToLNode; struct LNode{ ElementType Data; PtrToLNode Next; }; typedef PtrToLNode Position; typedef PtrToLNode List; List MakeEmpty()//初始化 { List L; L = (List)malloc(sizeof (struct LNode)); if (!L) exit (-1); L->Next = NULL; return L; } int FindKth(List L,int K)//根据指定的位序查找 { Position p; int cnt = 1;//位序从1开始 p = L->Next; while(p&&cnt<K) { p = p-> Next; cnt++; } if((cnt==K)&&p) printf("您查找的数为:%d\n",p -> Data); else printf("您查找数不存在"); } Position Find(List L,int X)//按值查找 { Position p; p = L->Next; while(p&&p->Data!=X) { p = p-> Next; } if(p) printf("查找成功,您查找的数为:%d\n",p->Data); else printf("您查找数不存在"); } List Insert(List L ,ElementType X,int i)//插入 { Position tmp,pre; int cnt =0 ; pre = L; while(pre&&cnt<i-1) { pre = pre->Next; cnt++; } if(pre==NULL||cnt!=i-1) { printf("插入位置参数错误\n"); } else { tmp = (Position)malloc(sizeof(struct LNode)); tmp->Data=X; tmp->Next=pre->Next; pre->Next=tmp; } } bool Delete(List L,int i){ //删除 Position tmp,pre; int cnt = 0; pre = L; while(pre&&cnt<i-1) { pre=pre->Next; cnt++; } if(pre==NULL||cnt!=i-1||pre->Next==NULL){ printf("删除位置参数错误"); } else { tmp = p re->Next; pre->Next = tmp->Next; free(tmp); printf("删除成功"); } } int Length(List L){ //求表长 Position p; int cnt = 0; p = L->Next;//p指向表的第一个结点 while(p) { p = p -> Next; cnt++;//当前指向第cnt个节点 } return cnt; } void DisLinkList(List L){ //输出 List p = L->Next; printf("输出链表: "); while (p) { printf("%d ", p->Data); p = p->Ne xt; } } int main() { Position pre; Position L = MakeEmpty(); pre = L; int i,n,x,len,cz,del; printf("您要输入几位数:"); scanf("%d",&n); for(i=1;i<=n;i++) { scanf("%d",&x); Insert(pre,x,i);//插入 } DisLinkList(pre); //输出 printf("\n"); len = Length(L);//求表长 printf("表长为:%d",len); printf("\n"); int l; printf("输入插入的数"); scanf("%d",&l); Insert(pre,l,n+1); DisLinkList(pre); printf("请输入你要按值查找的数:\n"); scanf("%d",&cz);//按值查找 Find(L,cz); printf("\n"); printf("请输入你要按序号查找的数的序号:\n"); scanf("%d",&cz); FindKth(L,cz); //按序号查找 printf("\n"); printf("请输入你要删除的数的下标:\n",del); scanf("%d",&del); Delete(L,del); //删除 DisLinkList(pre);//输出 printf("\n"); return 0; }
#include<stdio.h> #include<stdlib.h> #define MAXSIZE 10 typedef int Position; typedef int ElementType; typedef struct LNode * PtrToLNode; struct LNode//将数组Date和变量Last封装成一个结构体作为顺序表的类型; { ElementType Data[MAXSIZE]; Position Last; }; typedef PtrToLNode List; List MakeEmpty()//建表 { List L; L = (List)malloc(sizeof (struct LNode));//动态分配表结构所需要的存储空间; L->Last = -1; //Last指针置为1,表示表中没有数据 return L; } #define ERROR -1 Position Find(List L,ElementType X)//查找 { Position i = 0; while(i<=L->Last&&L->Data[i]!=X)//从第一个元素起依次与x比较直到相等后输出下标 { i++; } if(i>L->Last) //若到最后还没有找到,输出语句 printf("您查找的数不存在\n"); else printf("您查找数的存储下标为:%d",i); } Insert(List L ,ElementType X,int i)//插入 { Position j; if(L -> Last == MAXSIZE-1)//表空间已满,不能插入 { printf("表满"); return false; } if(i<1||i>L->Last+2)//检查插入位序的合法性:是否在1~n+1 { printf("位序不合法"); return false; } for(j=L->Last;j>=i-1;j--)//插入 { L->Data[j+1] = L-> Data[j]; } L->Data[i-1] = X; L->Last++; return true; } Delete(List L,int i) //删除 { Position j; if(i<1||i>L->Last+1)//表中没有元素 { printf("位序%d不存在元素\n",i); } else { for(j=i;j<=L->Last;j++) { L->Data[j] = L->Data[j+1]; } L->Last--; printf("删除成功\n"); } } int Length(List L)//求表长 { return L->Last+1; } int main() { List L = MakeEmpty(); int i,n,x,len,cz,del; double res; //插入 printf("您要输入几位数:"); scanf("%d",&n); for(i=1;i<=n;i++) { scanf("%d",&x); Insert(L,x,i); } //输出 printf("输出线性表:\n"); for(i=0;i<n;i++) { printf("%d ",L->Data[i]); } printf("\n"); //求表长 len = Length(L); printf("表长为:%d",len); printf("\n"); //查找 printf("请输入你要查找的数:\n"); scanf("%d",&cz); Find(L,cz); printf("\n"); //删除 printf("请输入你要删除的数的下标:\n",del); scanf("%d",&del); Delete(L,del); printf("输出线性表:\n"); for(i=0;i<=L->Last;i++) { printf("%d ",L->Data[i]); } printf("\n"); return 0; }
来源:陈越《数据结构》第二版