1. 程式人生 > >單鏈表及其基本操作的實現

單鏈表及其基本操作的實現

請在以下給出的部分源程式基礎上補全程式碼,完成單鏈表的C語言程式。然後再主函式通過呼叫單鏈表的操作中完成一下任務:首先定義一個單鏈表例項(變數),並初始化,採用尾插法向其中錄入10個整數(ElemType為int型別);然後,在第5個結點處插入一個新結點(值為5),再把第8個結點刪除;最後打印出所有元素。

/*①單鏈表資料結構定義*/

//結點定義

typedef struct LNode

{

ElemType data;

struct LNode *next;

}LNode;

//連結串列定義

typedef struct

{

LNode* head;  //指向頭結點的指標

int length;     //連結串列長度

}LinkList;

/*②單鏈表基本操作介面定義*/

//初始條件:線性表L已經初始化

//採用頭插法建立一個單鏈表,元素型別為整形,輸入-9999時結束

Status CreateFromHead(LinkList &L);

//初始條件:線性表L已經初始化

//採用尾插法建立一個單鏈表,元素型別為整形,輸入-9999時結束

Status  CreateFromTail(LinkList &L) ;

//初始條件:線性表L已經存在

//打印出所有元素

void PrintElem(LinkList L);

//初始條件:線性表L已經存在

//查詢第i個結點,若找到(1in),則由e返回其值

Status GetElem_L(LinkList L, int i,ElemType &e);

//初始條件:線性表L已經存在

//在單鏈線性表L的第i個元素之前插入元素e

Status ListInsert_L(LinkList &L, int i, ElemType e);

//初始條件:線性表L已經存在

//刪除第i個元素,並由e返回其值

Status ListDelete_L(LinkList &L, int i, ElemType &e);

#include<stdio.h>
#include<stdlib.h>
#define OK     1
#define ERROR  0
typedef int Status ;
typedef int ElemType ;
//結點定義
typedef struct LNode
{
	ElemType data;
	struct LNode *next;
}LNode,*LinkList;

//單鏈表的初始化 
Status  InitList_L(LinkList &L);

//初始條件:線性表L已經初始化
//採用頭插法建立一個單鏈表,元素型別為整形,輸入-9999時結束
Status CreateFromHead(LinkList &L);

//初始條件:線性表L已經初始化
//採用尾插法建立一個單鏈表,元素型別為整形,輸入-9999時結束
Status  CreateFromTail(LinkList &L) ;

//初始條件:線性表L已經存在
//打印出所有元素
void PrintElem(LinkList L);

//初始條件:線性表L已經存在
//查詢第i個結點,若找到(1≤i≤n),則由e返回其值
Status GetElem_L(LinkList L, int i,ElemType &e);

//初始條件:線性表L已經存在
//在單鏈線性表L的第i個元素之前插入元素e
Status ListInsert_L(LinkList &L, int i, ElemType e);

//初始條件:線性表L已經存在
//刪除第i個元素,並由e返回其值
Status ListDelete_L(LinkList &L, int i, ElemType &e);

//單鏈表的初始化
Status  InitList_L(LinkList &L)
{
	L =(LNode *)malloc(sizeof(LNode));   //申請結點空間 
    if(L == NULL)                       //判斷是否有足夠的記憶體空間 
        printf("申請記憶體空間失敗\n");
    L->next = NULL;                  //將next設定為NULL,初始長度為0的單鏈表 
    return OK;
}

//初始條件:線性表L已經初始化
//採用頭插法建立一個單鏈表,元素型別為整形,輸入-9999時結束
Status CreateFromHead(LinkList &L)
{
		 LinkList  s;
		 char c;
         L=(LNode*)malloc(sizeof(LNode));//為頭結點分配儲存空間
         L->next=NULL;
		 c = getchar(); 
         while(c != '$')
		   {                          /*為讀入的字元分配儲存空間*/
			 s=(LNode*)malloc(sizeof(LNode)); 
			 s->data=c;
             s->next=L;
			 L=s;      
		   }
		 
	return OK;
}

//初始條件:線性表L已經初始化
//採用尾插法建立一個單鏈表,元素型別為整形,輸入-9999時結束
Status  CreateFromTail(LinkList &L) 
{
    {  
		 LinkList r, s;
		 int c;
         L=(LNode * )malloc(sizeof(LNode));/*為頭結點分配儲存空間*/
         L->next=NULL; 
		 r=L;   /*r指標始終動態指向連結串列的當前表尾*/
		 printf("請依次輸入字元資料('-9999'表示輸入結束):\n"); 
		 scanf("%d",&c);
         while(c != -9999)/*標誌,初值為1。輸入“-9999”時flag為0,建表結束*/
		 {
	        s=(LNode*)malloc(sizeof(LNode)); 
			s->data=c;
            r->next=s;  
			r=s ;
			scanf("%d",&c);
		 }
		 r->next=NULL;
	}
	return OK;
}

//初始條件:線性表L已經存在
//在單鏈線性表L的第i個元素之前插入元素e
Status ListInsert_L(LinkList &L, int i, ElemType e)
 {
    LinkList s,p=L;
    int  j = 0;
    while (p&&j < i-1) 
	{  // 尋找第i-1個結點
       p = p->next;
       ++j;
	} 
    if (!p || j > i-1) return ERROR;      // i小於1或者大於表長
    s = (LinkList)malloc(sizeof(LNode));  // 生成新結點
    s->data = e;  s->next = p->next;      // 插入L中
    p->next = s;
    return OK;
} // LinstInsert_L

//初始條件:線性表L已經存在
//刪除第i個元素,並由e返回其值
Status ListDelete_L(LinkList &L, int i, ElemType &e) 
{
    LinkList p=L,q;
    int  j = 0;
    while (p->next && j < i-1) 
	{  // 尋找第i個結點,並令p指向其前趨
      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;
} // ListDelete_L

//初始條件:線性表L已經存在
//打印出所有元素
void PrintElem(LinkList L)
{
	LinkList p=L->next ;
	printf("當前的連結串列元素為:");
	while(p)
	{
		printf("  %d",p->data);
		p=p->next;
	}
    printf("\n");
}

//初始條件:線性表L已經存在
//查詢第i個結點,若找到(1≤i≤n),則由e返回其值
Status GetElem_L(LinkList L, int i,ElemType &e)
{   LNode  *p;
    int  j;
    p=L->next;  j=1;       // 從頭結點開始掃描
    while (p&&j<i)
    { 
	   p=p->next; ++j;   /* 掃描下一結點 */
    }                   /* 已掃描結點計數器 */
    if(!p||i>j) return ERROR;
    e=p->data;
    return OK;
}
void main()
{
	LinkList L;
	printf("**************尾插法建立單鏈表*******************\n");
	printf("向單鏈表錄入十個整數\n");
	CreateFromTail(L);
	PrintElem(L);
	printf("\n在第5個結點處插入一個新結點(值為5)\n");
	ListInsert_L(L,5,5);
	PrintElem(L);
    printf("\n第8個結點刪除後\n");
	ListDelete_L(L,8,L->data);
	PrintElem(L);
	system("pause");
}