下面这个程序基本上就是单链表的基本操作,是一个完整的可以在机器上运行的程序。供参考。include/*malloc等*/#include/*scanf,NULL*/#include/*free*/#include/*getch*//*函数结果状态代码*/#defineOK1#defineERROR0typedefintStatus;typedefintElemType;typedefstructLNode{ElemTypedata;structLNode*next;}LNode,*LinkList;voidCreateListLinkList*L,intn/*算法2.11*/{/*逆位序插在表头输入n个元素的值,建立带表头结构的单链线性表L*/inti;LinkListp;*L=LinkListmallocsizeofstructLNode;*L->next=NULL;/*先建立一个带头结点的单链表*/printf"请输入%d个数据",n;fori=n;i>0;--i{p=LinkListmallocsizeofstructLNode;/*生成新结点*/scanf"%d",&p->data;/*输入元素值*/p->next=*L->next;/*插入到表头*/*L->next=p;}}voidCreateList2LinkList*L,intn{/*正位序插在表尾输入n个元素的值,建立带表头结构的单链线性表L*/inti;LinkListp,q;*L=LinkListmallocsizeofstructLNode;/*生成头结点*/*L->next=NULL;q=*L;printf"请输入%d个数据",n;fori=1;idata;q->next=p;q=q->next;}p->next=NULL;}voidPrintlinklistLinkListL{LNode*p;p=L->next;whilep{printf"%d",p->data;ifp->nextprintf"-->";p=p->next;}printf"";}StatusListInsertLinkListL,inti,ElemTypee/*算法2.9。不改变L*/{/*在带头结点的单链线性表L中第i个位置之前插入元素e*/intj=0;LinkListp=L,s;whilep&&jnext;j++;}if!p||j>i-1/*i小于1或者大于表长*/returnERROR;s=LinkListmallocsizeofstructLNode;/*生成新结点*/s->data=e;/*插入L中*/s->next=p->next;p->next=s;returnOK;}StatusListDeleteLinkListL,inti,ElemType*e/*算法2.10。不改变L*/{/*在带头结点的单链线性表L中,删除第i个元素,并由e返回其值*/intj=0;LinkListp=L,q;whilep->next&&jnext;j++;}if!p->next||j>i-1/*删除位置不合理*/returnERROR;q=p->next;/*删除并释放结点*/p->next=q->next;*e=q->data;freeq;returnOK;}voidmain{inti,n=5;LinkListLa,Lb;ElemTypee1,e2;printf"头插法逆位序建表";CreateList&La,n;/*逆位序输入n个元素的值*/printf"La=";/*输出链表La的内容*/PrintlinklistLa;printf"";printf"按尾插法正序建表:";CreateList2&Lb,n;/*逆位序输入n个元素的值*/printf"Lb=";/*输出链表Lb的内容*/PrintlinklistLb;printf"";printf"输入插入的位置i=";scanf"%d",&i;printf"";printf"输入插入的元素e1=";scanf"%d",&e1;printf"";ListInsertLa,i,e1;printf"插入后La=";/*输出链表La的内容*/PrintlinklistLa;printf"";printf"输入删除的位置i=";scanf"%d",&i;printf"";ListDeleteLb,i,&e2;printf"删除后Lb=";/*输出链表La的内容*/PrintlinklistLb;printf"";printf"被删除的元素的值e2=%d",e2;printf。
龚岳洲2019-12-21 19:39:18
我把你的程序改好了,先复制在下面吧#include#include#include#define OK 1typedef int Status;typedef int ElemType;typedef struct LNode{ ElemType data;struct LNode * next;}LNode,* LinkList;void CreateList_LLinkList &L,int n//逆位序输入n个元素的值,建立带表头结点的单链线性表L{ int i;LNode * p;L=LinkListmallocsizeofLNode;L->next=NULL;//先建立一个带头结点的单链表fori=n;i>0;--i{ p=LinkListmallocsizeofLNode;//生成新结点printf"请输入第%d个结点的数据:",i;scanf"%d",&p->data;//输入元素值p->next=L->next;L->next=p;//插入到表头}}/*Status InitListLinkList &L { L=LinkListmallocsizeofLNode; L->next=NULL; return OK; }*/void MergeList_LLinkList &L1,LinkList &L2,LinkList &L3//已知单链线性表La和Lb的元素按值非递减排列{ LNode *pa, *pb, *pc; //归并La和Lb得到新的单链线性表Lc,Lc的元素也按值非递减排列pa=L1->next;//printf"%d",pa->data;pb=L2->next;//printf"%d",pb->data;L3=L1;//用La的头结点作为Lc的头结点pc=L3;whilepa!=NULL && pb!=NULL{ ifpa->datadata{pc->next=pa;pc=pa;pa=pa->next;}else{pc->next=pb;pc=pb;pb=pb->next;}}pc->next=pa?pa:pb;//插入剩余段freeL2;//释放Lb的头结点}void Print_LLinkList &L//打印链表{ LNode *p;p=L->next;ifp==NULL{printf"该链表为空";}else{whilep!=NULL{printf"%-5d",p->data;p=p->next;}}printf"";}void main{ int m,n; LinkList La, Lb, Lc;printf"请输入链表La中结点的个数:";scanf"%d",&m;printf"请输入链表La:"; CreateList_LLa,m;printf"链表La为:";Print_LLa;printf"请输入链表Lb中结点的个数:";scanf"%d",&n;printf"请输入链表Lb:";CreateList_LLb,n;printf"链表Lb为:";Print_LLb;// InitListLc; MergeList_LLa,Lb,Lc;printf"链表Lc为:";Print_LLc;}自定义函数Print_L那里有一些问题,打印链表的时候不能移动头结点,否则归并的时候就找不到头结点了。可以定义一个指针变量p,用来移动到下一个节点。别的没什么问题了。运行结果如下,你也可以自己跑一下程序,就看到结果了。最后链表Lc也是有序的。
龚宏辉2019-12-21 18:58:05