1. 程式人生 > >線性表----單鏈表

線性表----單鏈表

amp 線性表 truct stat 第一個元素 存儲結構 ext clas scan

一,實驗內容:鏈表的創建、插入與刪除操作

二.程序清單

三.思考

l.如果需要將新結點 插入 到 第i個數據元素之後,算法將如何改動?

2. 雙向鏈表和循環鏈表的定義和構造方法。

//鏈表的創建及插入、刪除操作
#include "stdio.h"
#include"stdlib.h"

#define NULL 0
#define error  0
#define ok 1
#define overflow -2
#define infeasible -1

//類型定義
typedef  int  Status;
typedef  int  ElemType;

//定義鏈表的存儲結構
typedef struct LNode {int data; //數據域 struct LNode *next; //指針域 }LNode,*LinkList; //鏈表的類型 Status GetElem_l(LinkList L, int i , ElemType &e) //L為帶頭結點的單鏈表,當第i 個元素存在時,其值賦給e. {int j; LinkList p ; p=L->next; j=1; while(p&&j<i) //順序找第i個元素. {p=p->next; ++j;} if(!p||j>i) return
error; e=p->data; return ok; } //逆序創建鏈表 void CreatList_L1(LinkList &L,int n) //n為元素個數,L為頭結點 {int i; LinkList p; L=(LinkList)malloc(sizeof(LNode)); //生成頭結點 L->next=NULL; for(i=n;i>0;i--) //鏈頭插入法 { p=(LinkList)malloc(sizeof(LNode)); scanf("%d",&p->data); p
->next=L->next; L->next=p; } } //正序創建單鏈表 void CreatList_L2(LinkList &L,int n ) ///n為元素個數,L為頭結點 {int i ; LinkList p,q; L=(LinkList )malloc(sizeof(LNode)); q=L; for(i=0;i<n;i++) //鏈尾插入法 { p=(LinkList )malloc(sizeof(LNode)); scanf("%d",&p->data); q->next=p; q=p; } q->next=NULL; } //輸出鏈表 void print(LinkList L) {LinkList p; p=L->next; while(p) {printf("%d ",p->data); p=p->next; } } //鏈表的插入操作 int ListInsert(LinkList &L,int i,int e) {LinkList p,s; int j; p=L;j=0; while(p&&j<i-1) {p=p->next; ++j;} if(!p||j>i-1) return error; s=(LinkList)malloc(sizeof(LNode)); s->data=e; s->next=p->next; p->next=s; return ok; } //鏈表的刪除操作 int ListDelete(LinkList &L,int i,int &e) {LinkList p,q; int j; p=L; j=0; while(p->next&&j<i-1) { p=p->next; ++j;} if(!(p->next)||j>i-1) return error; q=p->next;p->next=q->next; e=q->data;free(q); return ok; } //對鏈表的元素進行排序 Status sortlinklist(LinkList &L) {LinkList p,q,r; ElemType t; p=L->next; //p指向鏈表第一個元素結點 while(p->next!=NULL) {q=L->next; //q指向鏈表第一個元素結點 while(q->next!=NULL) {r=q->next; if(q->data>r->data) //相鄰兩個元素比較、交換 {t=q->data; q->data=r->data; r->data=t; } q=q->next; } p=p->next; } return ok ; } void mergelist_l(LinkList la, LinkList &lb, LinkList &lc) {LinkList pa,pb,pc; pa=la->next; pb=lb->next ; lc=pc=la; while(pa&&pb) if(pa->data <=pb->data) {pc->next=pa;pc=pa;pa=pa->next;} else {pc->next=pb;pc=pb;pb=pb->next;} pc->next=pa?pa:pb; free(lb); } //主函數通過調用創建、插入、刪除用輸出函數完成鏈表的基本操作 int main() {LinkList L1,L2,L3; int n,ins,del,i; //創建一個先進先出單鏈表 printf("please input FIFo linklist‘s node number n:\n"); scanf("%d",&n); printf("please input the linklist %d nodes data \n",n); CreatList_L2(L2,n); print(L2); printf("\n"); //創建一個後進先出單鏈表 printf("please input LIFO linklist‘s node number n:\n"); scanf("%d",&n); printf("please input the linklist %d nodes data \n",n); CreatList_L1(L1,n); print(L1); printf("\n"); //對鏈表進行插入操作 printf("please input the insert node‘s locate i and value e\n"); scanf("%d%d",&i,&ins); ListInsert(L1,i,ins); print(L1); printf("\n"); //對鏈表進行刪除操作 printf("please input the delete node‘s locate i\n"); scanf("%d",&i); ListDelete(L1,i,del); print(L1); printf("\n%d\n",del); //對鏈表進行排序 sortlinklist(L1); printf("\n the L1 list‘s sort is:\n"); print(L1); printf("\n the L2 list‘s sort is:\n"); sortlinklist(L2); print(L2); //對鏈表進行合並 printf("\n the merge result is : \n" ); mergelist_l(L1,L2,L3); print(L3); }

線性表----單鏈表