//C鏈表基本一系列操作,該鏈表不帶頭結點,沒有頭指針
#include <stdlib.h>
#include <stdio.h>
typedef int ElemType;
typedef struct List *link;
typedef struct List Lnode;
/*
* 結點結構
*/
struct List
{
ElemType data;
struct List *next;
};
/*
* 創造一個鏈表
* @param link Head 鏈表的首指針
* @return link Head 創建鏈表之後鏈表的首指針
*/
link create(link Head)
{
ElemType newData;
link NewPoint;
Head = (link)malloc(sizeof(Lnode));//申請空間
printf("please input number: \n");
scanf("%d", &newData);
Head->data = newData;
Head->next = NULL;
while (1)//循環讀入,直至結點數據域爲-1
{
NewPoint = (link)malloc(sizeof(Lnode));
if (NewPoint == NULL)
{
break;
}
printf("please input number : input '-1' means exit\n");
scanf("%d", &newData);
if (newData == -1) return Head;
NewPoint->data = newData;
NewPoint->next = Head;
//更新首結點
Head = NewPoint;
}
return Head;
}
/*
* 遍歷鏈表
* @parma link Head 鏈表的首指針
* @return void
*/
void display(link Head)
{
link p;
p = Head;
if (p == NULL)
{
printf("\nList is empty\n");
}
else
{
do
{
printf("%d\n", p->data);
p = p->next;
} while (p != NULL);
}
}
/*
* 在鏈表第i個位置插入結點
* @parma link Head 鏈表首指針
* @parma ElemType x 新結點數據域
* @parma int i 第i個結點位置
* @return link 更新新鏈表首指針
*/
link insert(link Head, ElemType x, int i)
{
link NewPoint, p = Head;
int j = 1;
NewPoint = (link)malloc(sizeof(Lnode));
NewPoint->data = x;
if (i == 1)
{
NewPoint->next = Head;
Head = NewPoint;
}
else
{
//找到前一個結點
while (j < i - 1 && p->next != NULL)
{
p = p->next;
j++;
}
if (j == i - 1)
{
//添加結點
NewPoint->next = p->next;
p->next = NewPoint;
}
else
{
printf("insert is Failure, i is not right\n");
}
return Head;
}
}
/*
* 刪除第i個結點
* @prama link Head 鏈表首指針
* @prama int i 刪除位置
* @return link Head 更新後鏈表首指針
*/
link del(link Head, int i)
{
int j = 1;
link p, t;
p = Head;
if (i == 1)
{
p = p->next;
free(Head);
Head = p;
}
else
{
//找到刪除結點前一個結點
while (j < i - 1 && p->next != NULL)
{
p = p->next;
j++;
}
if (p->next != NULL && j == i - 1)
{
t = p->next;
p->next = t->next;//刪除結點前一個結點的後繼是刪除結點的後繼
}
if (t != NULL)
{
free(t);//釋放刪除結點
}
}
return Head;
}
/*
* 獲得第i個結點元素值,找到返回相應元素值,否則返回-1
* @prama link Head 鏈表首指針
* @prama int i 結點位置
* @return ElemType 返回元素值
*/
ElemType get(link Head, int i)
{
int j = 1;
link p;
p = Head;
while (j < i && p != NULL)
{
j++;
p = p->next;
}
if (p != NULL)
{
return p->data;
}
else
{
printf("data is error!\n");
return -1;
}
}
/*
* 返回鏈表長度
* @prama link Head 鏈表首指針
* @return int len 鏈表長度
*/
int length(link Head)
{
int len = 0;
link p = Head;
while (p != NULL)
{
len++;
p = p->next;
}
return len;
}
/*
* 連接兩個鏈表
* @prama link Head1 鏈表1
* @prama link Head2 鏈表2
* @return link Head1 返回新鏈表
*/
link connect(link Head1, link Head2)
{
link p = Head1;
while (p->next != NULL)
{
p = p->next;
}
p->next = Head2;
return Head1;
}
/*
* 釋放鏈表
* @prama link Head 鏈表
* @return link Head 空鏈表
*/
link setnull(link Head)
{
link p = Head;
while (p != NULL)
{
p = p->next;
free(Head);
Head = p;
}
return Head;
}
/*
* 查找結點元素x的位置,找到返回相應位置,否則返回-1
* @prama link Head 鏈表首指針
* @prama ElemType x 待查找元素
* @return int n 元素位置
*/
int locate(link Head, ElemType x)
{
int n = 0;
link p = Head;
while (p != NULL && p->data != x)
{
p = p->next;
}
if (p == NULL)
{
return -1;
}
else
{
return n+1;
}
}
C鏈表
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.