用C语言实现对单链表的基本操作

Python011

用C语言实现对单链表的基本操作,第1张

#include <stdio.h>

#include <stdlib.h>

typedef int DataType

typedef struct node {

DataType member

struct node *next

}*LinkList, *pNode

// 初始化链表

LinkList GetEmptyList() {

LinkList head = (pNode)malloc(sizeof(struct node))

head->member = 0

head->next = NULL

return head

}

// 在非增链表中插入结点

void InsertNode(LinkList head, DataType x) {

pNode p,q

for(p = head p->next != NULL p = p->next) {

if(p->next->member <= x) {

q = (pNode)malloc(sizeof(struct node))

q->member = x

q->next = p->next

p->next = q

return

}

}

q = (pNode)malloc(sizeof(struct node))

q->member = x

q->next = p->next

p->next = q

}

// 新结点插入为首结点

void PushNode(LinkList head, DataType x) {

pNode p = (pNode)malloc(sizeof(struct node))

p->member = x

p->next = head->next

head->next = p

}

// 删除结点

int DeleteNode(LinkList head, DataType x) {

pNode p,q

for(p = head p != NULL p = p->next) {

if(p->next->member == x) {

q = p->next

p->next = q->next

free(q)

return 1 // 成功删除member(第一个)为x的结点

}

}

return 0 // 没有找到member为x的结点

}

// 查找结点

int FindNode(LinkList head, DataType x) {

pNode p

for(p = head->next p != NULL p = p->next) {

if(p->member == x) return 1 // 找到了

}

return 0 // 没有找到

}

// 销毁链表

void DestroyList(LinkList head) {

pNode q,p = head

while(p) {

q = p

p = q->next

free(q)

}

head = NULL

}

// 遍历链表

void ShowList(LinkList head) {

pNode p = head->next

while(p != NULL) {

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

p = p->next

}

printf("\n")

}

int main() {

DataType x,res

LinkList head = GetEmptyList()

printf("输入一个整数('q' to quit): ")

while(scanf("%d",&x) == 1) {

InsertNode(head, x) // 创建非增链表

printf("输入一个整数('q' to quit): ")

}

fflush(stdin)

ShowList(head)

printf("输入待查找的整数: ")

scanf("%d",&x)

res = FindNode(head, x)

if(res) printf("找到了。\n")

else printf("没找到!\n")

printf("输入待删除的整数: ")

scanf("%d",&x)

res = DeleteNode(head, x)

if(res) printf("成功删除。\n")

else printf("没找到数据为:%d的结点!\n",x)

ShowList(head)

DestroyList(head)

return 0

}

typedefstruct_List{intdatastruct_List*next}ListintQuery(List**head,intx){List*p=(*head)->nextintn=1while(p&&p->data!=x){p=p->nextn++}if(p)returnnelsereturn-1}

运行结果如下:

完整代码如下:

#include<stdio.h>

#include<stdlib.h>

typedef struct LNode

{

char data

LNode *next

}* LNodePtr

LNodePtr CreateList()

{

//初始化头节点

LNodePtr head = (LNodePtr)malloc(sizeof(LNode))

head->data = 0

head->next = NULL

LNodePtr tNode//临时节点

char data

while(true)

{

scanf("%c",&data)

if(data == '\0' || data == '\n' || data == '\r' || data == '\t')

{

continue

}

if(data == '!')//输入感叹号停止插入节点

{

printf("输入链表元素结束。\n")

break

}

if(data >= 'A' &&data <= 'Z')

{

tNode = (LNodePtr)malloc(sizeof(LNode))

tNode->data = data    /*  数据域赋值  */

tNode->next = head->next

head->next = tNode

}

else

{

printf("输入字符需为大写字母。\n")

}

}

return head

}

/**

加密函数,加密的方式为链接head的所有节点前移offset位,但是不支持offset比链表的节点数多

@param head 链表头节点

@param offset 节点前移的位数

*/

void EncryptList(LNodePtr head,int offset)

{

LNodePtr tNode = head->next

int i

for(i = 0i <offseti++)

{

if(tNode->next != NULL)

{

tNode = tNode->next

}

}

if(i == offset)

{

LNodePtr newHead = tNode

LNodePtr tail = tNode

while (tail->next != NULL)

{

tail = tail->next

}

tail->next = head->next

while(tNode->next != NULL)

{

if(tNode->next != newHead)

{

tNode = tNode->next

}

else

{

tNode->next = NULL

break

}

}

head->next = newHead

}

else

{

printf("不支持移动")

}

}

void ListPrint(LNodePtr head)

{

if(head->next != NULL)

{

LNodePtr tNode = head->next

while (tNode->next != NULL)

{

printf("%c ",tNode->data)

tNode = tNode->next

}

printf("%c",tNode->data)

}

}

int main()

{

LNodePtr list = CreateList()

printf("\n创建的链表如下:\n")

ListPrint(list)

EncryptList(list,3)

printf("\n所有节点前移了3位之后的链表如下:\n")

ListPrint(list)

printf("\n")

return 0

}

如果看不懂代码可以问我