C语言 建立链表(链表的结点类型与成员个数等由学生自己定义)

实现所建立链表的遍历、插入下个结点之后遍历、删除一个结点遍历、查找一个结点。

#include"stdio.h"
#include"string.h"
#include"stdlib.h"
#include"malloc.h"
#include"conio.h"

/*定义DataType为int类型*/
typedef int DataType;
#define TRUE 1
#define FALSE 0

/*单链表的结点类型*/
typedef struct LNode
{DataType data; <br/> struct LNode *next; <br/> }LNode,*LinkedList;

/*初始化单链表*/
LinkedList LinkedListInit()
{LinkedList L; <br/> L=(LinkedList)malloc(sizeof(LNode)); <br/> L->next=NULL;<br/> printf("初始化单链表成功\n"); <br/> return L; <br/>}

/*清空单链表*/
void LinkedListClear(LinkedList &L)
{L->next=NULL; <br/> printf("链表已经清空\n"); <br/>}

/*检查单链表是否为空*/
int LinkedListEmpty(LinkedList &L)
{if(L->next==NULL) <br/> {printf("单链表为空\n"); return TRUE;}
else
{printf("单链表非空\n");return FALSE;}
}

/*遍历单链表*/
void LinkedListTraverse(LinkedList &L)
{LinkedList p; <br/> p=L->next; <br/> if(p==NULL) <br/> printf("单链表为空表\n"); <br/> else <br/> {printf("链表中的元素为:\n"); <br/> while(p!=NULL) <br/> {printf("%d ",p->data); p=p->next;}
}
printf("\n");
}

/*求单链表长度*/
int LinkedListLength(LinkedList &L)
{LinkedList p; <br/> int j; <br/> p=L->next; <br/> j=0; <br/> while(p!=NULL) <br/> { j++; p=p->next;}
return j;
}

/*从链表中查找元素*/
LinkedList LinkedListGet(LinkedList &L,int i)
{LinkedList p;<br/> p=L->next;int j=1; <br/> while(p&&j<i) {p=p->next; j++;}
if(p) printf("位序为%d的元素的值为%d\n",i,p->data);
else printf("查询位置不正确\n");
}

/*从链表中查找与给定元素值相同的元素在顺序表中的位置*/
int LinkedListLocate(LinkedList &L,DataType x)
{LinkedList p;int i=1; <br/> p=L->next; <br/> while(p && p->data != x) {p=p->next;i++;}
if(p) {printf("所查找的元素%d在表中的位置为%d\n",x,i);return i; }
else {printf("所查找的元素%d不存在\n",x);return 0; }
}

/*向链表中插入元素*/
void LinkedListInsert(LinkedList &L, int i, DataType x)
{LinkedList p,s;<br/> int j=0; p=L; <br/> while(p&&j<i) {p=p->next;j++;}
if(!p||j>i) printf("插入位置不正确\n");
else
{s=(LNode *)malloc(sizeof(LNode)); <br/> s->data=x; <br/> s->next=p->next; <br/> p->next=s; <br/> printf("在表中第%d个节点后插入%d成功\n",i,x); <br/> }
}

/*从链表中删除元素*/
void LinkedListDel(LinkedList &L,int i)
{ LinkedList p,q;
int j=0;
p=L;
while(p->next&&j<i-1) {p=p->next;j++;}
if(p->next==NULL)
printf("删除位置不正确\n");
else
{q=p->next;p->next=q->next;free(q);<br/> printf("第%d个元素已从链表中删除\n",i);<br/> }
}

/*最后改好的将头插发改为尾插法了*/
LinkedList LinkedListCreat(LinkedList&L,int n) /*建立单链表*/
{ int i;
DataType x;
LinkedList p;
L=(LinkedList)malloc(sizeof(LNode));
L->next=NULL;
for(i=n;i>0;--i)
{p=(LinkedList)malloc(sizeof(LNode));<br/> printf("请依次输入链表中的元素:");<br/> scanf("%d",&x);<br/> p->data=x;<br/> p->next=L->next;L->next=p;<br/> }
printf("输入完毕\n");
return L;
}

main()
{printf("请用数字键选择操作\n\n");<br/> printf("1.初始化\n");<br/> printf("2.建立单链表\n");<br/> printf("3.清空\n");<br/> printf("4.求链表长度\n");<br/> printf("5.检查链表是否为空\n");<br/> printf("6.遍历链表\n");<br/> printf("7.从链表中查找元素\n");<br/> printf("8.从链表中查找与给定元素值相同的元素在顺序表中的位置\n");<br/> printf("9.向链表中插入元素\n");<br/> printf("0.从链表中删除元素\n\n");<br/> printf("按其他键退出\n"); <br/> <br/>LinkedList L;<br/>int i,x,n,quit=0;<br/>while(!quit)<br/>switch(getch()) <br/>{<br/>case '1':L=LinkedListInit(); break;<br/>case '2':printf("请输入需要的链表的长度为:");scanf("%d",&n);L=LinkedListCreat(L,n); break; <br/>case '3':LinkedListClear(L);break; <br/>case '4':printf("链表的长度为 %d(不含头节点)\n",LinkedListLength(L)); break; <br/>case '5':LinkedListEmpty(L); break; <br/>case '6':LinkedListTraverse(L); break; <br/>case '7':printf("请输入待查询元素在链表中的位置:");scanf("%d",&i);LinkedListGet(L,i); break; <br/>case '8':printf("请输入待查询元素的值:"); scanf("%d",&x); LinkedListLocate(L,x); break; <br/>case '9':printf("请输入插入元素的位置和值(中间用逗号隔开):\n"); scanf("%d,%d",&i,&x); <br/> LinkedListInsert(L,i,x); break; <br/>case '0':if(LinkedListEmpty(L)==1) printf("链表已经为空,不能删除\n");<br/> else printf("请输入待删除元素的位置:\n"); scanf("%d",&i); LinkedListDel(L,i);<br/> break; <br/><br/>default:quit=1; <br/>}
}
温馨提示:答案为网友推荐,仅供参考
第1个回答  2013-07-02
查一下书吧
书上讲得那么详细
这个要贴上来要敲多久呢?
相似回答