#include<stdio.h> #include<stdlib.h> #include<malloc.h> #define ERROR 0; typedef struct LNode/*定义一个列表结构体*/ { int data; struct LNode *next; }LNode,*LinkList; LinkList InitList(LinkList L) //动态分配链表存储空间 { LinkList p = NULL; p = (LinkList)malloc(sizeof(LNode)); if(!p) return ERROR; p->next = NULL; L = p; return L; } LinkList CreateList_L(LinkList L,int n) //创建链表,输入数据元素 { int i; LinkList p = NULL; for(i=0;i<n;i++){ p = (LinkList)malloc(sizeof(LNode)); scanf("%d",&p->data); p->next = L->next; L->next = p; } return L; } int ListLength(LinkList L) //求链表的长度 { LinkList p = NULL; int count = 0; p = L; while(p->next) { count++; p = p->next; } return count; } LinkList ListInsert(LinkList L,int i,int e)//插入数据元素 { int j = 0; LinkList s = NULL,p = NULL; p = L; while(p && j<i-1) { p = p->next; j++; } if(!p||j>i-1) { return 0; } s = (LinkList)malloc(sizeof(LNode)); s->data = e; s->next = p->next; p->next = s; return L; } LinkList ListDelete(LinkList L,int i) //删除数据元素 { int j; LinkList q = NULL,p = NULL; p = L; j = 0; while(p->next&&j<i-1) { p = p->next; j++; } if(!(p->next)||j>i-1) { return 0; } q = p->next; p->next = q->next; free(q); return L; } int GetElem(LinkList L,int i)//取出数据元素 { int j,e; LinkList p = NULL; if(i<1||i>ListLength(L)) { return 0; } p = L->next; j = 1; while(j<i) { p = p->next; j++; } e = p->data; printf("第%d位的数据元素为%d\n",i,e); return i; } void menu() { printf(" 功能1 :输出单链表中的各元素值\n"); printf(" 功能2 :在单链表中插入数据元素\n"); printf(" 功能3 :在单链表中删除数据元素\n"); printf(" 功能4 :取出单链表中的数据元素\n"); printf(" 功能5 :求出单链表的长度 \n"); printf(" 输 入 0 结束操作\n"); } void main() { int n=0,m=0,i=0,e=0; LinkList L = NULL,p = NULL; L = InitList(L); printf("单链表中元素个数:"); scanf("%d",&n); L = CreateList_L(L,n); do{ printf("\n\n"); menu(); printf("输入选择的功能:"); scanf("%d",&m); switch(m) { case 1: printf("链表的元素为:"); p = L->next; while(p!=NULL) { printf("%d ",p->data); p = p->next; } printf("\n"); break; case 2: printf("输入插入位置和数据元素(空格隔开):"); scanf("%d %d",&i,&e); L = ListInsert(L,i,e); printf("插入元素后链表的元素为:"); p = L->next; while(p!=NULL){ printf("%d ",p->data); p = p->next; } printf("\n"); break; case 3: printf("输入需要删除的元素的位置:"); scanf("%d",&i); L = ListDelete(L,i); printf("删除元素后链表的元素为:"); p = L->next; while(p!=NULL){ printf("%d ",p->data); p = p->next; } printf("\n"); break; case 4: printf("输入需要取出的元素的位置:"); scanf("%d",&i); GetElem(L,i); break; case 5: printf("线性表的长度为: %d \n",ListLength(L) ); break; case 0: printf("结束程序\n"); break; default: printf("输入错误\n"); } }while(m!=0); }
转载于:https://www.cnblogs.com/-liuhuanchao/p/3659424.html