编写一个C语言程序 实现单链表的基本操作

Python023

编写一个C语言程序 实现单链表的基本操作,第1张

# include <stdio.h>

# include <malloc.h>

# include <stdlib.h>

typedef struct Node

{

int data

struct Node * pNext

} * PNODE, NODE

PNODE establish_list (void)

void traverse_list (PNODE pHead)

bool is_empty(PNODE pHead)

int length_list(PNODE pHead)

void sort_list(PNODE pHead)

void insert_list(PNODE pHead, int pos, int val)

int delete_list(PNODE pHead, int pos, int val)

void freeer(PNODE pHead)

int main(void)

{

PNODE pHead

int len, i, j, val

pHead = establish_list()

traverse_list(pHead)

if(is_empty(pHead))

printf("链表为空\n")

else

printf("链表不空\n")

len = length_list(pHead)

printf("链表的长度为: %d\n", len)

sort_list(pHead)

traverse_list(pHead)

printf("请输入您要在第几个节点插入\n")

scanf("%d", &i)

printf("请输入您要在第%d个节点插入的值\n", i)

scanf("%d", &j)

insert_list(pHead, i, j)

traverse_list(pHead)

printf("请输入您要第几个删除的节点\n")

scanf("%d", &i)

val = delete_list(pHead, i, val)

printf("您删除的节点值为: %d\n", val)

traverse_list(pHead)

freeer(pHead)

return 0

}

PNODE establish_list(void)//初始化链表,返回头结点地址

{

int val, len

PNODE Tem

PNODE pNew

PNODE pHead

pHead = (PNODE)malloc(sizeof(NODE))

Tem = pHead

if(NULL == pHead)

{

printf("分配失败")

exit(-1)

}

Tem->pNext = NULL

printf("请输入您要定义节点的长度: ")

scanf("%d", &len)

for (int i=0i<len++i)

{

printf("请输入第%d个节点的值: ", i+1)

scanf("%d", &val)

pNew = (PNODE)malloc(sizeof(NODE))

if(NULL == pNew)

{

printf("分配失败")

exit(-1)

}

pNew->data = val//首先把本次创建的新节点的值付给新节点的数据域

Tem->pNext = pNew//然后使用临时的节点变量的指针域保存了新节点的地址,也就是指向了新节点

pNew->pNext = NULL//如何再不循环,新节点成为最后一个节点

Tem = pNew//把本次分配的新节点完全的赋给Tem,Tem就成为了这次新节点的影子,那么下次分配新节点时可以使用上个新节点的数据

}

return pHead

}

void traverse_list(PNODE pHead)

{

PNODE p = pHead//使用P是为了不改写头结点里保存的地址

p = pHead->pNext//使P指向首节点

while(p != NULL)//P本来就是头结点的指针域,也就是首节点的地址,既然是地址就可以直接判断p是否等于NULL

{

printf("%d ", p->data)

p = p->pNext//使P每循环一次就变成P的下一个节点

}

}

bool is_empty(PNODE pHead)

{

if(NULL == pHead->pNext)

return true

else

return false

}

int length_list(PNODE pHead)

{

PNODE p = pHead->pNext

int len = 0

while(p != NULL)

{

len++

p = p->pNext

}

return len

}

void sort_list(PNODE pHead)

{

int i, j, t, len

PNODE p, q

len = length_list(pHead)

for(i=0,p=pHead->pNexti<leni++,p=p->pNext)//逗号后只是为了找到下一个节点,因为不是数组,所以不能使用下标来++

{

for(j=0,q=pHead->pNextj<lenj++,q=q->pNext)

if(q->data >p->data)//这里的大小与号可以决定是升序还是降序,如果是大于号就是升序,反之小于号就是降序

{

t = q->data

q->data = p->data

p->data = t

}

}

return

}

void insert_list(PNODE pHead, int pos, int val)

{

int i

PNODE q = pHead

PNODE p = pHead

if(pos >0 &&pos <= length_list(pHead))

{

for(i=0i<posi++)

{

q = q->pNext//q就是要插入的连接点

}

for(i=1i<posi++)

{

p = p->pNext//p就是要插入连接点的前一个节点

}

PNODE pNew = (PNODE)malloc(sizeof(NODE))

p->pNext = pNew

pNew->data = val

pNew->pNext = q

}

else if(pos >length_list(pHead))//追加

{

PNODE t

t = pHead

PNODE PN

PN = (PNODE)malloc(sizeof(NODE))

if(PN == NULL)

printf("分配失败")

else

while(t->pNext != NULL)

{

t = t->pNext//使T->pNext成为尾结点

}

PN->data = val//给新节点赋予有效数据

t->pNext = PN//使尾结点的指针域指向了新的结点

PN->pNext = NULL//新节点成为尾结点

}

else

printf("error\n")

return

}

int delete_list(PNODE pHead, int pos, int val)

{

int i, j

PNODE q, p

q = pHead

p = pHead

if(pos >0 &&pos <= length_list(pHead))//保证删除的是节点的有效数

{

for(i=0i<posi++)

{

p = p->pNext

}

for(j=1j<posj++)

{

if(pos == 0)

q = pHead

else

q = q->pNext

}

q->pNext = p->pNext

val = p->data

free(p)

return val

}

else

printf("error")

}

void freeer(PNODE pHead)

{

PNODE pT = pHead

while(NULL != pHead->pNext)

{

free(pT)

pT = pT->pNext

}

return

}

/*

好久以前写的一个链表了,有排序,插入,删除,输出,判断是否为空,甚至还有释放堆中内存的功能

*/

节点就是一个结构体 里面封装了数据域 和指向这个结构体类型变量的指针。

struct a

{

数据域

struct a *p

}

然后链表就可以靠这个p把所有的节点连接起来

两个链表的结构体时一样的吧 ,比方说,第一个链表的头结点是 head1指针,第二个链表的头结点是 head2指针, 如果你需要,把head2位头指针的链表连接到head1为头指针的尾部,

第一步 ,你需要遍历找到head1为头指针的链表的最后一个结点,final,

代码操作是:

比方说结构体类型名是node的话,

node p = head1

node q

while(p!=NULL)

{

q = p

p = p->next

}

p->next = final

return head1

这样就ok了 ,楼主