您的位置:首页 > 其它

链表的操作

2006-06-07 11:28 330 查看
链表是数据结构中的一个重要组成部分,对链表操作的熟练度怎么要求都不过分。
(只有部分核心代码)

主要内容:
1) 链表的建立
2) 链表的释放
3) 链表的查找
4) 链表中节点的插入
5) 链表中节点的删除
6) 链表的反转
7) 两个链表的连接

#define MAX 15
/* 节点声明 */
struct list
{
int number;
int name[MAX];
struct list *next;
};
typedef struct list Node;
typedef Node *Link;

/* 建立链表,返回指向头节点的指针 */
Link Creat_List(Link head)
{
int dataNum; /* 数据编号 */
char dataName[MAX]; /* 数据名字 */
Link newNode;
Link pointer;
int i;

/* 创建头节点 */
head = (Link) malloc(sizeof(Node)); /* 分配内存 */

if( NULL == head )
printf(" Allocation Failure/n"); /* 分配内存失败 */
else
{
dataNum = 1;
printf("Enter the data name:/n");
scanf("%s",dataNum);
head->number = dataNum;

for( i=0; i<MAX; ++i)
head->name[ i] = dataNum[ i];

head->next = NULL;

pointer = head;

/* 创建链表 */
while(1)
{
dataNum++;

newNode = (Link)malloc(sizeof(Node));
printf("Enter the data name:/n");
sacnf("%s",dataName);

if(dataName[0] == '0') /* 输入0,结束 */
break;

newNode->number = dataNum;
for( i=0; i<MAX; ++i)
newNode->name[ i] = dataName[ i];
newNode->next = NULL;

pointer->next = newNode; /* 连接新节点 */

pointer = newNode;
}
}

return head;
}

/* 释放链表 */
void free_list(Link head)
{
Link pointer;

while( head != NULL )
{
pointer = head;
head = head->next;
free(pointer);
}
}

/* 链表的查找 */
int Search_list(int key, Link head) /* key 为要查找的数据 */
{
Link pointer;
pointer = head;

while( pointer != NULL )
{
if( pointer->number == key )
{
printf("found it!/n");
return 1;
}
}

return 0;
}

/* 节点的插入 */
Link Insert_list(Link head, Link newNode, int key)
{
Link pointer;
pointer = head;

while(1)
{
/* 在链表头之前插入 */
if( NULL == pointer )
{
newNode->next = head;
head = newNode;
break;
}

/* 在链表其他地方插入 */
if( pointer->number == key )
{
newNode->next = pointer->next;
pointer->next = newNode;
break;
}

pointer = pointer->next ;

return head;
}
}

/* 链表里节点的删除 */
Link Delete_list(Link head, int key)
{
Link pointer;
Link back;

pointer = head;

while(1)
{
if( pointer->next == NULL )
{
printf("not found./n");
break;
}

/* 删除的节点是头节点 */
if( head->number == key)
{
head = pointer->next ;
free(pointer);
break;
}

/* 删除链表中其他节点 */
back = pointer;
pointer = pointer->next ;

if( pointer->next == key )
{
back->next = pointer->next ;
free(pointer);
break;
}
}

return head;
}

/* 链表的反转 */
Link Reverse_list(Link head)
{
Link pointer;
Link back;
Link nextNode;

back = head; /* back 指针设为首节点 */
pointer = back->next;
back->next = NULL;

nextNode = pointer->next;
pointer->next = back;
back = pointer;
pointer = nextNode;

while( pointer->next != NULL )
{
nextNode = pointer->next;
pointer->next = back;
back = pointer;
pointer = nextNode;
}
/* 达到链表尾 */
pointer->next = back;
head = pointer;

return head;
}

/* 两个链表的连接 */
Link Connect_list( Link head1, Link head2)
{
Link pointer;
Link back;
Link nextNode;

pointer = head1;

while( pointer->next != NULL )
pointer = pointer->next;

pointer->next = head2;

return head1;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: